import VueRouter from 'vue-router'

// VueRouter 实例化 以后产生 $router 实例
// 通过 this.$router.xx 调用一个方法的时候，会现在本身进行查找，
// 如果没有，就会找构造函数的原型
// 所以 push、replace 方法实际上都在 VueRouter 原型上

// const cachePush = VueRouter.prototype.push

// this.$router.push('/', () => {}, () => {})
// this.$router.push('/', () => {})
// this.$router.push('/', undefined, () => {})
// this.$router.push('/')
// VueRouter.prototype.push = function (history, successCb, errorCb) {
//   if (successCb || errorCb) {
//     // cachePush.call(this, ) 类似于 this.$router.push()
//     cachePush.call(this, history, successCb, errorCb)
//   } else {
//     cachePush.call(this, history, () => {})
//   }
// }

const methodArr = ['push', 'replace']

methodArr.forEach((method) => {
    // 将 路由原型上的方法进行缓存
    // @ts-ignore
    const cacheMethod = VueRouter.prototype[method]
    // @ts-ignore

    VueRouter.prototype[method] = function (history, successCb, errorCb) {
        if (successCb || errorCb) {
            // call() 方法使用一个指定的 this 值和一个或多个参数来调用一个函数。
            // this 指 this.$router.push/replace
            cacheMethod.call(this, history, successCb, errorCb)
        } else {
            cacheMethod.call(this, history, () => { })
        }
    }
})
